欢迎关注“小丫画图”公众号,回复“小白”,看小视频,实现点鼠标跑代码。

小丫微信: epigenomics E-mail:

作者:@ 西红柿

小丫编辑校验

需求描述

小丫姐,能众筹利用USCS上的pan-cancer数据分别通过EPIC和Cibersort算法,计算各个肿瘤的免疫细胞浸润信息,并输出结果,同时计算某个指定基因在各个肿瘤中分别与免疫细胞的相关性,并分别输出相关性热图和相关性信息的excel表?

例文只使用了一种方法,我想用多种方法来证明相关性

出自https://www.frontiersin.org/articles/10.3389/fonc.2021.634617/full

FIGURE 7 | Associations of CD96 expression to tumor purity and immune infiltration. (B) The correlations of CD96 expression and immune infiltration in cancers.

Besides, we employed TIMER2.0 to exhibit the landscape of CD96 correlating with various immune infiltrates in human cancers (Figure 7B). # 应用场景

分别用TIMER、EPIC、Cibersort计算各个肿瘤的免疫细胞浸润信息。

热图可用于展示目的基因在泛癌中与免疫浸润之间的关系。

下面分别展示TIMER、EPIC、Cibersort这三种计算方法并画图(例文用的是TIMER2.0)。三种方法的细胞不同,可相互参照,结合研究兴趣,讨论自己的结果。

环境设置

使用国内镜像安装包

options("repos"= c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
options(BioC_mirror="http://mirrors.tuna.tsinghua.edu.cn/bioconductor/")
install.packages("showtext")

# 安装IOBR,参照https://github.com/IOBR/IOBR
if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
depens <- c('tibble', 'survival', 'survminer', 'sva', 'limma', "DESeq2","devtools",
          'limSolve', 'GSVA', 'e1071', 'preprocessCore', 'ggplot2', "biomaRt",
          'ggpubr', "devtools", "tidyHeatmap", "caret", "glmnet", "ppcor", "timeROC","pracma")
for(i in 1:length(depens)){
  depen<-depens[i]
  if (!requireNamespace(depen, quietly = TRUE))
    BiocManager::install(depen,update = FALSE)
}
if (!requireNamespace("remotes", quietly = TRUE)) install("remotes")
if (!requireNamespace("EPIC", quietly = TRUE))
  remotes::install_github("GfellerLab/EPIC", build_vignettes=TRUE)
if (!requireNamespace("MCPcounter", quietly = TRUE))
  remotes::install_github("ebecht/MCPcounter",ref="master", subdir="Source")
if (!requireNamespace("estimate", quietly = TRUE)){
  rforge <- "http://r-forge.r-project.org"
  install.packages("estimate", repos=rforge, dependencies=TRUE)
}
devtools::install_github("IOBR/IOBR")
# 如果网络不好,可以从github下载后本地安装,安装包已上传至https://share.weiyun.com/g2BTNgVX
install.packages("IOBR-master.tar.gz", repos = NULL, type = "source")

加载包

library(ggplot2)
library(ggpubr)
library(patchwork)
library(showtext)
## Loading required package: sysfonts
## Loading required package: showtextdb
library(EPIC)
library(IOBR)
## Loading required package: tibble
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Loading required package: survival
## Loading required package: ComplexHeatmap
## Loading required package: grid
## ========================================
## ComplexHeatmap version 2.4.3
## Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
## Github page: https://github.com/jokergoo/ComplexHeatmap
## Documentation: http://jokergoo.github.io/ComplexHeatmap-reference
## 
## If you use it in published research, please cite:
## Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional 
##   genomic data. Bioinformatics 2016.
## 
## This message can be suppressed by:
##   suppressPackageStartupMessages(library(ComplexHeatmap))
## ========================================
## Loading required package: tidyHeatmap
## ========================================
## tidyHeatmap version 1.2.2
## If you use tidyHeatmap in published research, please cite:
## 1) Mangiola et al. tidyHeatmap: an R package for modular heatmap production 
##   based on tidy principles. JOSS 2020.
## 2) Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional 
##   genomic data. Bioinformatics 2016.
## This message can be suppressed by:
##   suppressPackageStartupMessages(library(tidyHeatmap))
## ========================================
## 
## Attaching package: 'tidyHeatmap'
## The following object is masked from 'package:stats':
## 
##     heatmap
## ==========================================================================
##  IOBR v0.99.9    For help: https://github.com/IOBR/IOBR/issues
## 
##  If you use IOBR in published research, please cite:
##  DQ Zeng, ZL Ye, RF Sheng, GC Yu, …, WJ Liao*.
##  IOBR: Multi-omics Immuno-Oncology Biological Research to decode 
##   tumor microenvironment and signatures. bioRxiv, 2020.2012.2014.422647 (2020). 
##  DOI: 10.1101/2020.12.14.422647
## ==========================================================================
showtext.auto(enable = TRUE)
## 'showtext.auto()' is now renamed to 'showtext_auto()'
## The old version still works, but consider using the new function in future code
font.add('arial', 'arial.ttf') #设置字体,windows用户
## 'font.add()' is now renamed to 'font_add()'
## The old version still works, but consider using the new function in future code
Sys.setenv(LANGUAGE = "en") #显示英文报错信息
options(stringsAsFactors = FALSE) #禁止chr转成factor

TIMER

从TIMER下载数据

Methods: Tumor IMmune Estimation Resource 2.0 (TIMER2.0; http://timer.cistrome.org/) web server is a comprehensive resource forsystematical analysis of immune infiltrates across diverse cancertypes. At first, we used it to study the differential expressionof CD96 between tumor and adjacent normal tissues across all TCGA cohorts.

We then explored the association between CD96 expression and immune infiltration based on several immune deconvolution algorithms

进入 TIMER2.0 或者 TIMER2.0 (comp-genomics.org),按一下步骤获得分析结果文件:

  • 点击Immune
  • Gene Expression里选择CD96
  • Immune Infiltrates里每次选一种免疫细胞
  • 点击Submit
  • 点击Table下载分析结果
  • 重复以上操作,直到获得所有免疫细胞的分析结果,放到data文件夹下。(虽然一次可以选择多个细胞,但网站对数量有限制,所以我们还是一次只选一种细胞。 !!!Querying 115 interested features exceeds the limited amount (n=20). Please reduce the number. )

批量读入TIMER结果

data文件夹里除了从TIMER下载的Table表以外,不要放其他任何文件。

setwd("./data")
file <- dir()
data <- list()
for (i in (1:length(file))) {
  data[[i]] <- read.csv(file[i],header = T)
}

画图前的数据预处理

TIMER的免疫细胞分类细致,有19类,例文给每一类画成一个小热图,排成了两行,因此画图时麻烦些。

# y轴排列顺序
name <- c("UVM (n=80)", "UCS (n=57)", "UCEC (n=545)", "THYM (n=120)", 
        "THCA (n=509)", "TGCT (n=150)", "STAD (n=415)", "SKCM (n=471)", 
        "SKCM-Primary (n=103)", "SKCM-Metastasis (n=368)", "SARC (n=260)", 
        "READ (n=166)", "PRAD (n=498)", "PCPG (n=181)", "PAAD (n=179)", 
        "OV (n=303)", "MESO (n=87)", "LUSC (n=501)", "LUAD (n=515)", 
        "LIHC (n=371)", "LGG (n=516)", "KIRP (n=290)", "KIRC (n=533)", 
        "KICH (n=66)", "HNSC (n=522)", "HNSC-HPV +  (n=98)", "HNSC-HPV- (n=422)", 
        "GBM (n=153)", "ESCA (n=185)", "DLBC (n=48)", "COAD (n=458)", 
        "CHOL (n=36)", "CESC (n=306)", "BRCA (n=1100)", "BRCA-LumB (n=219)", 
        "BRCA-LumA (n=568)", "BRCA-Her2 (n=82)", "BRCA-Basal (n=191)", 
        "BLCA (n=408)", "ACC (n=79)")

# 定义函数画heatmap
plot_tme <- function(x){
  x$pvalue = ifelse(x$adj.p >= 0.05, "p≥0.05", "p<0.05")
  x$cancer = factor(x$cancer, levels = name) 
  
  ggplot(x, aes(infiltrates, cancer, 
                shape = pvalue, 
                color = rho)) +
    geom_point(size = 3) + 
    scale_shape_manual(values = c(15, 7)) + 
    scale_color_gradient2(low = "#2b8cbe",mid = "white",high = "#e41a1c") + 
    #scale_x_discrete(position = "top") + 
    theme_bw() + 
    theme(axis.title.y = element_blank(),
          axis.title.x = element_blank(),
          axis.text.x = element_text(angle = 90,hjust = 0,vjust = 0),
          axis.text.x.bottom = element_text(family = "arial"))
}

# 画出19个热图
dd <- lapply(data, plot_tme)
#dd[[1]] # 可以这样查看每一个heatmap

画图

# 设置和下半部分分割的位置
breakpoint <- 8 # 上面画8个热图,下面画19-8=11个

## 先画上半部分
# 画第1个热图(第1个热图左侧带label,其余不带)
up <- dd[[1]] + 
  scale_x_discrete(position = "top") + 
  guides(color=FALSE) + guides(shape=FALSE) # 不画图例

# 加上第2-8个热图
for (i in 2:(breakpoint)) {
  up <- up + dd[[i]] + 
    scale_x_discrete(position = "top") + 
    theme(axis.text.y = element_blank()) + # 不画y轴label
    guides(color = FALSE) + guides(shape = FALSE) # 不画图例
}

# 按照x轴来调整图片组合宽度
width_up <- NULL
for (i in 1:breakpoint) {
  width_up <- c(width_up,length(unique(data[[i]]$infiltrates)))
}

# 画完上半部分
up + plot_layout(guides = 'collect',widths = width_up)
## Warning: Removed 10 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 8 rows containing missing values (geom_point).

## 画下半部分
# 画下面第1个
down <- dd[[breakpoint + 1]] + scale_x_discrete(position = "bottom") + 
  guides(color = FALSE) + guides(shape = FALSE) + # 不画图例
  theme(axis.text.x = element_text(angle = 90,hjust = 1,vjust = 0))

# 画第10-18个热图
for (i in (breakpoint + 2):(length(file)-1)) {
  down <- down + dd[[i]] + scale_x_discrete(position = "bottom") + 
    theme(axis.text.y = element_blank(),
          axis.text.x = element_text(angle = 90,hjust = 1,vjust = 0)) + 
    guides(color=FALSE) + guides(shape=FALSE) # 不画图例
}

# 画第19个,画图例
down <- down + dd[[length(file)]] + scale_x_discrete(position = "bottom") + 
  theme(axis.text.y = element_blank(),
        axis.text.x = element_text(angle = 90,hjust = 1,vjust = 0))

down <- down & scale_fill_continuous(limits = c(-1, 1))

# 按照x轴来调整图片组合宽度
width_down <- NULL
for (i in (breakpoint + 1):length(file)) {
  width_down <- c(width_down,length(unique(data[[i]]$infiltrates)))
}

# 画完下半部分
down + plot_layout(guides = 'collect',widths = width_down)
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing missing values (geom_point).

## 上下组合
(up + plot_layout(guides = 'collect',widths = width_up))-(down + plot_layout(guides = 'collect',widths = width_down)) + plot_layout(nrow = 2)
## Warning: Removed 10 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 8 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing missing values (geom_point).

# 保存到文件
ggsave("TIMER.pdf", 
       height=15, width=10)
## Warning: Removed 10 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 8 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing missing values (geom_point).
# 输出的PDF文件是矢量图,可以用illustrator等矢量图编辑器打开,进一步调整图形、文字

EPIC

免疫浸润算法强烈推荐IOBR(GitHub - IOBR/IOBR: IOBR is an R package to perform comprehensive analysis of tumor microenvironment and signatures for immuno-oncology.

输入数据

pancancer_mRNA_exprSet.Rdata,表达矩阵和癌症名type

expr_pancancer.Rda,表达矩阵,取自pancancer_mRNA_exprSet.Rdata。

数据来源于UCSC xena Pan-cancer,从数据下载到获得以上两个文件的过程见TCGA_pan.R(位于当前文件夹)。文件太大,已上传微云https://share.weiyun.com/g2BTNgVX

# 载入数据
(load("expr_pancancer.Rda"))
## [1] "expr"
expr[1:5,1:5]
##            TCGA-OR-A5J1 TCGA-OR-A5J2 TCGA-OR-A5J3 TCGA-OR-A5J5 TCGA-OR-A5J6
## OR4F5           -9.9658      -9.9658      -9.9658      -9.9658      -9.9658
## FO538757.3      -9.9658      -9.9658      -3.4580      -9.9658      -3.6259
## FO538757.2       4.6502       3.9783       3.5803       3.6916       4.8724
## OR4F29          -9.9658      -6.5064      -9.9658      -3.8160      -9.9658
## OR4F16          -9.9658      -6.5064      -9.9658      -3.8160      -9.9658
dim(expr)
## [1] 17146  9712
(load("pancancer_mRNA_exprSet.Rdata")) 
## [1] "mRNA_exprSet"
mRNA_exprSet[1:5,1:5]
##            sample      TCGA_id type subtype   OR4F5
## 1 TCGA-OR-A5J1-01 TCGA-OR-A5J1  ACC      01 -9.9658
## 2 TCGA-OR-A5J2-01 TCGA-OR-A5J2  ACC      01 -9.9658
## 3 TCGA-OR-A5J3-01 TCGA-OR-A5J3  ACC      01 -9.9658
## 4 TCGA-OR-A5J6-01 TCGA-OR-A5J6  ACC      01 -9.9658
## 5 TCGA-OR-A5J7-01 TCGA-OR-A5J7  ACC      01 -9.9658
dim(mRNA_exprSet)
## [1]  7801 19729

运行EPIC

#epic <- deconvo_tme(eset = expr, 
#                    method = "epic", 
#                    arrays = FALSE)
# save(epic,file = "epic.Rda")

load("epic.Rda")
dim(epic)
## [1] 7801    9
#epic[1:5,]
epic$ID <- gsub("\\.","-",epic$ID)
data <- merge(epic, 
              mRNA_exprSet, 
              by.x = "ID", by.y = "sample")
#data[1:5,]
dim(data)
## [1]  7800 19737

计算相关性

# 自定义计算相关性的函数
corr <- function(gene){
  y <- as.numeric(data[, gene])
  colnames <- colnames(epic[, 2:9])
  do.call(rbind,lapply(colnames, function(x){
    dd <- cor.test(as.numeric(data[, x]), y, type = "spearman")
    data.frame(gene = gene, immune_cells = x,
               cor = dd$estimate, p.value = dd$p.value )
  }))
}
# 计算相关性
corr("CD96")
##      gene     immune_cells          cor       p.value
## cor  CD96      Bcells_EPIC  0.201971593  1.337815e-72
## cor1 CD96        CAFs_EPIC  0.009873013  3.832944e-01
## cor2 CD96  CD4_Tcells_EPIC  0.480019990  0.000000e+00
## cor3 CD96  CD8_Tcells_EPIC  0.407591892 5.076429e-310
## cor4 CD96 Endothelial_EPIC -0.042554096  1.703373e-04
## cor5 CD96 Macrophages_EPIC  0.008188060  4.696516e-01
## cor6 CD96     NKcells_EPIC  0.067188593  2.855490e-09
## cor7 CD96  otherCells_EPIC -0.553441917  0.000000e+00
gene <- "CD96"
cancertype <- unique(data$type)
res <- data.frame(type=NULL,
                  gene=NULL,
                  immune_cells=NULL,
                  cor=NULL,
                  p.value=NULL)

for (i in cancertype){
  data2 <- data %>% filter(type==i)
  y <- as.numeric(data2[,gene])
  colnames <- colnames(epic[,2:9])
  dd2 <- do.call(rbind,lapply(colnames, function(x){
    dd <- cor.test(as.numeric(data2[,x]),y,type = "spearman")
    data.frame(type = i,
               gene = gene,
               immune_cells = x,
               cor = dd$estimate,
               p.value = dd$p.value )
             }))
  res <- rbind(res,dd2)
}
res$pvalue <- ifelse(res$p.value >= 0.05,"p≥0.05","p<0.05")
head(res)
##      type gene     immune_cells         cor      p.value  pvalue
## cor   GBM CD96      Bcells_EPIC  0.42256581 1.619400e-07  p<0.05
## cor1  GBM CD96        CAFs_EPIC -0.04028372 6.340841e-01 p≥0.05
## cor2  GBM CD96  CD4_Tcells_EPIC -0.17117552 4.166795e-02  p<0.05
## cor3  GBM CD96  CD8_Tcells_EPIC  0.34204163 3.096633e-05  p<0.05
## cor4  GBM CD96 Endothelial_EPIC -0.25386741 2.299519e-03  p<0.05
## cor5  GBM CD96 Macrophages_EPIC  0.15633575 6.317888e-02 p≥0.05
write.csv(res,"output_res.EPIC.csv")

画图

EPIC只有8种细胞,画在一起就可以了。

保持跟上面TIMER组合图的风格一致。

ggplot(res, aes(immune_cells,
               type,
               shape = pvalue,
               color = cor)) +  
geom_point(size = 3) + 
scale_shape_manual(values = c(15,7)) + 
scale_color_gradient2(low = "#2b8cbe",
                      mid = "white",
                     high = "#e41a1c",
                   limits = c(-1, 1)) + 
theme_bw() + 
theme(axis.title.y = element_blank(),
      axis.title.x = element_blank(),
      axis.text.x = element_text(angle = 90,
                                 hjust = 1,
                                 vjust = 0,
                                family = "arial"))

ggsave("EPIC.pdf", width = 4, height = 7)

Cibersort

输入数据同“EPIC”的输入数据

运行Cibersort

# 用IOBR包计算
#cibersort <- deconvo_tme(eset = expr, 
#                      method = "cibersort", 
#                      arrays = FALSE, 
#                      perm = 200 )

# pancancer的免疫细胞浸润信息可以用IOBR计算,也可以直接导入官方数据 [CIBERSORT immune fractions](https://gdc.cancer.gov/about-data/publications/panimmune)
# 这里直接导入官方数据
cibersort <- read.table("TCGA.Kallisto.fullIDs.cibersort.relative.tsv", header = T)

cibersort$SampleID <- substring(cibersort$SampleID,1,15)
cibersort$SampleID <- gsub("\\.","-",cibersort$SampleID)

cibersort <- merge(cibersort,
                   mRNA_exprSet,
                   by.x = "SampleID",
                   by.y = "sample")

计算相关性

gene <- "CD96"
res <- data.frame(type=NULL,
                  gene=NULL,
                  immune_cells=NULL,
                  cor=NULL,
                  p.value=NULL)

for (i in cancertype){
  data2 <- cibersort %>% filter(type==i)
  y <- as.numeric(data2[,gene])
  colnames <- colnames(cibersort[,3:24])
  dd2 <- do.call(rbind,lapply(colnames, function(x){
    dd <- cor.test(as.numeric(data2[,x]),y,type = "spearman")
    data.frame(type = i,
               gene = gene,
               immune_cells = x,
               cor = dd$estimate,
               p.value = dd$p.value )
  }))
  res <- rbind(res,dd2)
}
## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero

## Warning in cor(x, y): the standard deviation is zero
res$pvalue <- ifelse(res$p.value >= 0.05,"p≥0.05","p<0.05")
head(res)
##      type gene               immune_cells         cor    p.value  pvalue
## cor   GBM CD96              B.cells.naive  0.03270965 0.69814824 p≥0.05
## cor1  GBM CD96             B.cells.memory -0.02616166 0.75644282 p≥0.05
## cor2  GBM CD96               Plasma.cells  0.07045307 0.40307529 p≥0.05
## cor3  GBM CD96                T.cells.CD8 -0.18280972 0.02886319  p<0.05
## cor4  GBM CD96          T.cells.CD4.naive  0.02621328 0.75597738 p≥0.05
## cor5  GBM CD96 T.cells.CD4.memory.resting  0.06235925 0.45937045 p≥0.05
write.csv(res, "output_res.Cibersort.csv")

画图

Cibersort有22种细胞,也可以画在一起。并保持跟以上两种方法的画图风格一致。

ggplot(res, aes(immune_cells,
            type,
            shape = pvalue,
            color = cor)) +  
  geom_point(size = 3) + 
  scale_shape_manual(values = c(15,7)) + 
  scale_color_gradient2(limits = c(-1, 1),
                        low = "#2b8cbe",
                        mid = "white",
                        high = "#e41a1c") + 
  theme_bw() + 
  theme(axis.title.y= element_blank(),
        axis.title.x = element_blank(),
        axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   vjust = 0,
                                   family = "arial"))
## Warning: Removed 8 rows containing missing values (geom_point).

ggsave("Cibersort.pdf", width = 5, height = 7)
## Warning: Removed 8 rows containing missing values (geom_point).

Session Info

sessionInfo()
## R version 4.0.2 (2020-06-22)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS  10.16
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] zh_CN.UTF-8/zh_CN.UTF-8/zh_CN.UTF-8/C/zh_CN.UTF-8/zh_CN.UTF-8
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] IOBR_0.99.9          tidyHeatmap_1.2.2    ComplexHeatmap_2.4.3
##  [4] survival_3.2-10      dplyr_1.0.5          tibble_3.1.1        
##  [7] EPIC_1.1.5           showtext_0.9-2       showtextdb_3.0      
## [10] sysfonts_0.8.3       patchwork_1.1.1      ggpubr_0.4.0        
## [13] ggplot2_3.3.3       
## 
## loaded via a namespace (and not attached):
##   [1] readxl_1.3.1                backports_1.2.1            
##   [3] circlize_0.4.12             GSEABase_1.50.1            
##   [5] splines_4.0.2               BiocParallel_1.22.0        
##   [7] GenomeInfoDb_1.24.2         digest_0.6.27              
##   [9] foreach_1.5.1               htmltools_0.5.1.1          
##  [11] viridis_0.6.0               fansi_0.4.2                
##  [13] magrittr_2.0.1              memoise_2.0.0              
##  [15] cluster_2.1.2               openxlsx_4.2.3             
##  [17] limma_3.44.3                readr_1.4.0                
##  [19] annotate_1.66.0             modelr_0.1.8               
##  [21] matrixStats_0.58.0          limSolve_1.5.6             
##  [23] lpSolve_5.6.15              colorspace_2.0-0           
##  [25] blob_1.2.1                  rvest_1.0.0                
##  [27] haven_2.4.0                 xfun_0.22                  
##  [29] crayon_1.4.1                RCurl_1.98-1.3             
##  [31] jsonlite_1.7.2              graph_1.66.0               
##  [33] genefilter_1.70.0           zoo_1.8-9                  
##  [35] iterators_1.0.13            glue_1.4.2                 
##  [37] survminer_0.4.9             gtable_0.3.0               
##  [39] zlibbioc_1.34.0             XVector_0.28.0             
##  [41] GetoptLong_1.0.5            DelayedArray_0.14.1        
##  [43] car_3.0-10                  shape_1.4.5                
##  [45] BiocGenerics_0.34.0         abind_1.4-5                
##  [47] scales_1.1.1                DBI_1.1.1                  
##  [49] rstatix_0.7.0               Rcpp_1.0.6                 
##  [51] viridisLite_0.4.0           xtable_1.8-4               
##  [53] clue_0.3-59                 foreign_0.8-81             
##  [55] bit_4.0.4                   proxy_0.4-25               
##  [57] km.ci_0.5-2                 preprocessCore_1.50.0      
##  [59] GSVA_1.36.3                 stats4_4.0.2               
##  [61] glmnet_4.1-1                httr_1.4.2                 
##  [63] RColorBrewer_1.1-2          ellipsis_0.3.1             
##  [65] farver_2.1.0                pkgconfig_2.0.3            
##  [67] XML_3.99-0.6                sass_0.3.1                 
##  [69] dbplyr_2.1.1                locfit_1.5-9.4             
##  [71] utf8_1.2.1                  labeling_0.4.2             
##  [73] later_1.1.0.1               tidyselect_1.1.0           
##  [75] rlang_0.4.10                AnnotationDbi_1.50.3       
##  [77] munsell_0.5.0               cellranger_1.1.0           
##  [79] tools_4.0.2                 cachem_1.0.4               
##  [81] generics_0.1.0              RSQLite_2.2.6              
##  [83] broom_0.7.6                 evaluate_0.14              
##  [85] stringr_1.4.0               fastmap_1.1.0              
##  [87] yaml_2.2.1                  knitr_1.32                 
##  [89] bit64_4.0.5                 fs_1.5.0                   
##  [91] zip_2.1.1                   survMisc_0.5.5             
##  [93] purrr_0.3.4                 mime_0.10                  
##  [95] xml2_1.3.2                  shinythemes_1.2.0          
##  [97] compiler_4.0.2              curl_4.3                   
##  [99] png_0.1-7                   e1071_1.7-6                
## [101] ggsignif_0.6.1              reprex_2.0.0               
## [103] estimate_1.0.13             geneplotter_1.66.0         
## [105] bslib_0.2.4                 stringi_1.5.3              
## [107] highr_0.9                   forcats_0.5.1              
## [109] lattice_0.20-41             Matrix_1.3-2               
## [111] KMsurv_0.1-5                vctrs_0.3.7                
## [113] pillar_1.6.0                lifecycle_1.0.0            
## [115] jquerylib_0.1.3             GlobalOptions_0.1.2        
## [117] data.table_1.14.0           cowplot_1.1.1              
## [119] bitops_1.0-6                httpuv_1.5.5               
## [121] GenomicRanges_1.40.0        R6_2.5.0                   
## [123] promises_1.2.0.1            gridExtra_2.3              
## [125] rio_0.5.26                  IRanges_2.22.2             
## [127] codetools_0.2-18            MASS_7.3-53.1              
## [129] assertthat_0.2.1            SummarizedExperiment_1.18.2
## [131] DESeq2_1.28.1               rjson_0.2.20               
## [133] withr_2.4.2                 S4Vectors_0.26.1           
## [135] GenomeInfoDbData_1.2.3      parallel_4.0.2             
## [137] hms_1.0.0                   quadprog_1.5-8             
## [139] tidyverse_1.3.1             tidyr_1.1.3                
## [141] class_7.3-18                rmarkdown_2.7              
## [143] carData_3.0-4               shiny_1.6.0                
## [145] Biobase_2.48.0              lubridate_1.7.10